/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DTD;

import Excepciones.DTDException;
import Excepciones.InvalidReadException;
import Utilidades.LectorXML;
import java.io.FileNotFoundException;

/**
 *
 * @author Administrador
 */
public class ParserDTD {

    private LectorDTD dtdReader; //lector del DTD
    private String[] reglasExternas; //reglas del DTD, pero si èste es externo
    private String[] reglasInternas; //reglas del DTD, pero si èste es externo
    private DTDValidador dtdValidador; //validador

    /**
    * Constructor que crea las reglas, ya sean de un DTD interno o externo, y genera
    * el validador.
    * @param reader Lector del archivo XML
    * @throws DTDException
    */
    public ParserDTD(LectorXML reader) throws DTDException {
        try {
            dtdReader = new LectorDTD(reader);
            reglasExternas = dtdReader.getReglasExternas();
            reglasInternas = dtdReader.getReglasInternas();
            generarValidadorDTD();
        } catch (InvalidReadException ex) {
            String msg = ex.getMessage();
            throw new DTDException(msg);
        } catch (FileNotFoundException ex) {
            String msg = ex.getMessage();
            throw new DTDException(msg);
        }
    }

    /**
     * Retorna el validador DTD generado
     * @return Validador DTD
     */
    public DTDValidador getDtdValidador() {
        return dtdValidador;
    }

    /**
     * Genera el validador DTD, con todas las reglas que éste incluye
     * @throws DTDException
     */
    private void generarValidadorDTD() throws DTDException {
        DTDGenerarValidador dtdValidatorGenerator = new DTDGenerarValidador();

        //se cargan reglas externas
        for (int i = 0; reglasExternas != null && i < reglasExternas.length; i++) {
            String regla = reglasExternas[i];
            dtdValidatorGenerator.generarValidador(regla, false);
        }

        //se cargan reglas internas
        for (int i = 0; reglasInternas != null && i < reglasInternas.length; i++) {
            String regla = reglasInternas[i];
            dtdValidatorGenerator.generarValidador(regla, true);
        }

        dtdValidatorGenerator.commit();
        dtdValidador = dtdValidatorGenerator.getDTDValidador();
    }

}
